const express = require('express')
// 导入path包
const {
    resolve
} = require('path')
const formidable = require('formidable')
// 引入用于捕获异常的工具包
const {
    to
} = require('await-to-js')
// 引入状态码
const {
    SUCCESS,
    FAILED
} = require('../utils/contants')
// 引入UserModel表
const UserModel = require('../db/models/UserModel')
const md5 = require('md5')

// 创建路由器
const router = express.Router()

// 获取用户列表数据
router.get('/user/:page/:limit', async (req, res) => {
    // 获取params参数
    const {
        page,
        limit
    } = req.params
    // 获取当前页数据
    const skip = (page - 1) * limit
    // 获取列表数据
    const [err, data] = await to(UserModel.find().skip(skip).limit(limit))
    // 获取用户总数
    const total = await UserModel.count()
    if (err) {
        res.json({
            code: FAILED,
            message: '获取用户列表失败！'
        })
    } else {
        res.json({
            code: SUCCESS,
            data: {
                data,
                total
            },
            message: '获取用户列表成功~'
        })
    }
})

// 获取用户信息
router.get('/user', async (req, res) => {
    const {
        id
    } = req.query
    const [err, data] = await to(UserModel.findById({
        _id: id
    }))
    if (err) {
        console.log(err);
        res.json({
            code: FAILED,
            message: '获取用户信息失败！'
        })
    } else {
        res.json({
            code: SUCCESS,
            data,
            message: '获取用户列表成功~'
        })
    }
})

// 删除用户信息
router.delete('/user/:id', async (req, res) => {
    // 获取params参数
    const {
        id
    } = req.params
    // 删除数据库中对应用户
    const [err, data] = await to(UserModel.deleteOne({
        _id: id
    }))
    // 如果删除失败则返回错误信息
    if (err) {
        res.json({
            code: FAILED,
            message: '删除失败！'
        })
    } else { // 如果删除成功则返回成功信息
        res.json({
            code: SUCCESS,
            data,
            message: '删除成功~'
        })
    }
})

// 添加用户
router.post('/user', (req, res) => {
    // 创建解析请求的form对象
    const form = formidable({
        uploadDir: resolve(__dirname, '../public/upload'), //上传的图片存入的目录位置
        keepExtensions: true //保留文件扩展名
    })
    // 解析请求  => 自动保存文件
    form.parse(req, async (error, fileds, files) => {
        // 如果出现错误说明用户上传出错
        if (error) {
            return res.json({
                code: FAILED,
                message: error.message
            })
        }
        // 解构出用户名和密码
        const {
            username,
            pwd
        } = fileds
        // 查找用户户名是否重复
        let user = await UserModel.findOne({
            username
        })
        // 如果用户名重复则返回错误信息
        if (user) {
            return res.json({
                code: FAILED,
                message: '用户已存在!'
            })
        }
        // 找出filename
        const filename = files['profile'].newFilename
        const profile = `/upload/${filename}`
        // 向数据库中添加用户
        const data = await UserModel.create({
            username,
            pwd: md5(pwd),
            profile
        })
        res.json({
            code: SUCCESS,
            data,
            message: '用户添加成功~'
        })
    })
})

// 更新用户信息
router.put('/user', (req, res) => {
    // 创建解析请求的form对象
    const form = formidable({
        uploadDir: resolve(__dirname, '../public/upload'), //上传的图片存入的目录位置
        keepExtensions: true //保留文件扩展名
    })
    form.parse(req, async (error, fileds, files) => {
        // 如果出现错误就返回错误信息
        if (error) {
            return res.json({
                code: FAILED,
                message: '用户输入错误！'
            })
        }
        // 获取用户ID和用户名
        const {
            _id,
            username
        } = fileds
        const filename = files['profile'].newFilename
        const profile = `/upload/${filename}`
        // 更新数据库数据
        const [err, data] = await to(UserModel.updateOne({
            _id
        }, {
            username,
            profile
        }))
        if (err) {
            return res.json({
                code: FAILED,
                message: err.message
            })
        }
        // 返回数据
        res.json({
            code: SUCCESS,
            data,
            message: '更新用户成功~'
        })
    })
})

// 暴露路由器
module.exports = router